package com.postaop.hntl.front.iso8583;

import java.util.BitSet;

import com.enlorenz.common.util.ByteArrayUtils;
import com.enlorenz.common.util.CodeUtils;

/**
 * 数据工具
 * @author Karma
 */
public class BinaryUtils {
	//存在的位图
	public static final char BITMAP_ON='1';
	//不存在的位图
	public static final char BITMAP_OFF='0';
	//位图域长度
	public static final int BITMAP_LENGTH=64;
	//每个字节的位数
	public static final int BIT_LENGTH=8;
	
	/**
	 * 截取byte数组
	 * @param data 数据
	 * @param length 长度
	 * @param counter 计数器
	 * @return
	 */
	public static byte [] subBytes(byte [] data,int length,FieldCounter counter){
		byte [] result=ByteArrayUtils.subByte(data, counter.getCount(), counter.getCount()+length);
		counter.addCount(length);
		return result;
	}
	
	/**
	 * 靠左添加byte数组
	 * @param value 数据
	 * @param size 长度
	 * @return
	 */
	public static byte [] appendLeftBytes(byte [] value
			,int size){
		int leftLen=size-value.length;
		if(leftLen>0){
			return ByteArrayUtils.byteAdd(new byte[leftLen], value);
		}else{
			return value;
		}
	}
	
	/**
	 * 靠右添加byte数组
	 * @param value 数组
	 * @param size 长度
	 * @return
	 */
	public static byte [] appendRightBytes(byte [] value
			,int size){
		int leftLen=size-value.length;
		if(leftLen>0){
			return ByteArrayUtils.byteAdd(value,new byte[leftLen]);
		}else{
			return value;
		}
	}
	
	/**
	 * 创建16进制的binary长度
	 * @return
	 */
	public static byte [] createHexBinaryLength(int length,int size){
		String hex=Integer.toHexString(length);
		byte [] bytes=CodeUtils.hexString2Bytes(hex);
		
		int left=size-bytes.length;
		if(left>0){
			return ByteArrayUtils.byteAdd(new byte[left],bytes);
		}else{
			return bytes;
		}
	} 
	
	public static String byte2bits(byte b) {
		int z = b;
		z |= 256;
		String str = Integer.toBinaryString(z);
		int len = str.length();
		return str.substring(len - 8, len);
	}
	
	public static byte bit2byte(String bString){
		byte result=0;
		for(int i=bString.length()-1,j=0;i>=0;i--,j++){
			result+=(Byte.parseByte(bString.charAt(i)+"")*Math.pow(2, j));
		}
		return result;
	}
	
	public static byte [] createBitmap(BitSet bs){
		
		byte [] bitBytes=new byte[BITMAP_LENGTH/BIT_LENGTH];
		
		StringBuffer bitmapBuffer=new StringBuffer(BIT_LENGTH);
		for(int i=1;i<=BITMAP_LENGTH;i++){
			if(bs.get(i)){
				bitmapBuffer.append(BITMAP_ON);
			}else{
				bitmapBuffer.append(BITMAP_OFF);
			}
			if(i%8 == 0|| i == (BITMAP_LENGTH)){
				byte b=bit2byte(bitmapBuffer.toString());
				bitBytes[i/BIT_LENGTH-1]=b;
				bitmapBuffer=new StringBuffer(BIT_LENGTH);
			}
		}
		
		return bitBytes;
	}
	
	public static BitSet getBitmap(byte [] bitmapBytes){
		BitSet bs = new BitSet(BITMAP_LENGTH);
		StringBuffer bitmapBuffer=new StringBuffer();
		for (int i = 0; i < bitmapBytes.length; i++) {
			String bitStr=BinaryUtils.byte2bits(bitmapBytes[i]);
			bitmapBuffer.append(bitStr);
        }
		
		String bitString=bitmapBuffer.toString();
		
		for(int i=0;i<bitString.length();i++){
			char c=bitString.charAt(i);
			if(c == BITMAP_ON){
				//域的索引以1开始
				int fieldIndex=i+1;
				bs.set(fieldIndex);
			}
		}
		
		return bs;
	}
	
	
}
